Depois de uma boa preparação, prestei o processo seletivo para trabalhar na renomada empresa de aluguel de espaços, chamada ErBnB. Após a primeira semana de recepção, juntei-me ao time de Cientistas de Dados da empresa com foco em expansão, na cidade de Nova York, Estados Unidos. Esse projeto de expansão é muito importante para o ErBnB, mas também é muito arriscado. Qualquer decisão errada por parte do CEO pode levar a empresa a ter um prejuízo enorme.
Para diminuir o risco desse projeto, o meu chefe pediu para que eu auxiliasse o CEO da empresa, utilizando dados para responder algumas perguntas, que o ajudarão a tomar melhores decisões comerciais e de marketing.
Antes de dar início à resolução das questões levantadas pelo CEO, fiz um planejamento em 3 passos simples:
# Importando as bibliotecas a serem utilizadas
import pandas as pd
import numpy as np
import plotly.express as px #plotagem de gráficos
import folium #plotagem de mapas
# Carregando o arquivo csv
df = pd.read_csv('./archive/AB_NYC_2019.csv')
| Coluna | Descrição |
|---|---|
| id | Identificador do registro na base de dados |
| name | Nome do Anúncio na plataforma do Airbnb |
| host_id | Identificador do Host (Dono do Imóvel) |
| host_name | Nome do Host |
| neighbourhood_group | Região da Cidade de Nova York |
| neighbourhood | Bairro (Está dentro de uma das Regiões) |
| latitude | Ponto Geográfico de Latitude |
| longitude | Ponto Geográfico de Longitude |
| room_type | Tipo da Locação (Quarto, Casa inteira, etc) |
| price | Preço do aluguel (diária) |
| minimum_nights | Diárias Mínimas para Locação |
| number_of_reviews | Quantidade de Avaliações |
| last_review | Data da última avaliação feita |
| reviews_per_month | Quantidade de Revisões Mensais |
| calculated_host_listings_coun | t Quantidade de Anúncios do Host do Imóvel |
| availability_365 | Tempo (dias) em que o anúncio está disponível |
# Número de linhas e colunas(Dimensão do dataset)
df.shape
(48895, 16)
# Primeiras linhas do dataset
df.head()
| id | name | host_id | host_name | neighbourhood_group | neighbourhood | latitude | longitude | room_type | price | minimum_nights | number_of_reviews | last_review | reviews_per_month | calculated_host_listings_count | availability_365 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2539 | Clean & quiet apt home by the park | 2787 | John | Brooklyn | Kensington | 40.64749 | -73.97237 | Private room | 149 | 1 | 9 | 2018-10-19 | 0.21 | 6 | 365 |
| 1 | 2595 | Skylit Midtown Castle | 2845 | Jennifer | Manhattan | Midtown | 40.75362 | -73.98377 | Entire home/apt | 225 | 1 | 45 | 2019-05-21 | 0.38 | 2 | 355 |
| 2 | 3647 | THE VILLAGE OF HARLEM....NEW YORK ! | 4632 | Elisabeth | Manhattan | Harlem | 40.80902 | -73.94190 | Private room | 150 | 3 | 0 | NaN | NaN | 1 | 365 |
| 3 | 3831 | Cozy Entire Floor of Brownstone | 4869 | LisaRoxanne | Brooklyn | Clinton Hill | 40.68514 | -73.95976 | Entire home/apt | 89 | 1 | 270 | 2019-07-05 | 4.64 | 1 | 194 |
| 4 | 5022 | Entire Apt: Spacious Studio/Loft by central park | 7192 | Laura | Manhattan | East Harlem | 40.79851 | -73.94399 | Entire home/apt | 80 | 10 | 9 | 2018-11-19 | 0.10 | 1 | 0 |
# Tipo de dados de cada coluna
df.dtypes
id int64 name object host_id int64 host_name object neighbourhood_group object neighbourhood object latitude float64 longitude float64 room_type object price int64 minimum_nights int64 number_of_reviews int64 last_review object reviews_per_month float64 calculated_host_listings_count int64 availability_365 int64 dtype: object
# Número de dados falantes de cada coluna
df.isna().sum()
id 0 name 16 host_id 0 host_name 21 neighbourhood_group 0 neighbourhood 0 latitude 0 longitude 0 room_type 0 price 0 minimum_nights 0 number_of_reviews 0 last_review 10052 reviews_per_month 10052 calculated_host_listings_count 0 availability_365 0 dtype: int64
# Informações gerais sobre o dataset
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 48895 entries, 0 to 48894 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 48895 non-null int64 1 name 48879 non-null object 2 host_id 48895 non-null int64 3 host_name 48874 non-null object 4 neighbourhood_group 48895 non-null object 5 neighbourhood 48895 non-null object 6 latitude 48895 non-null float64 7 longitude 48895 non-null float64 8 room_type 48895 non-null object 9 price 48895 non-null int64 10 minimum_nights 48895 non-null int64 11 number_of_reviews 48895 non-null int64 12 last_review 38843 non-null object 13 reviews_per_month 38843 non-null float64 14 calculated_host_listings_count 48895 non-null int64 15 availability_365 48895 non-null int64 dtypes: float64(3), int64(7), object(6) memory usage: 6.0+ MB
# Excluindo linhas com dados faltantes
df1 = df.dropna()
# Verificando a dimensão do dataset
df1.shape
(38821, 16)
1 - Qual o valor médio do aluguel na cidade de Nova York?
# Atribuindo a coluna price a uma variável
cols = ['price']
# Atribuindo o dataset filtrado a uma variável
mean_price = df1.loc[:, cols]
# Calculando a média
mean_price.mean().round(2)
price 142.33 dtype: float64
2 - Quais os nomes das regiões que existem na cidade de Nova York?
cols = ['neighbourhood_group']
regiao = df1.loc[:, cols]
# Acessando valores únicos
np.unique(regiao)
array(['Bronx', 'Brooklyn', 'Manhattan', 'Queens', 'Staten Island'],
dtype=object)
3 - Qual o valor do aluguel diário mais caro da cidade de Nova York?
cols = ['price']
max_price = df1.loc[:,cols]
# Verificando valor máximo
max_price.max()
price 10000 dtype: int64
4 - Quais são as categorias de imóveis que estão cadastradas dentro da base de dados da cidade de Nova York?
df1.room_type.unique()
array(['Private room', 'Entire home/apt', 'Shared room'], dtype=object)
5 - Existem quantos usuários (Hosts) únicos cadastrados dentro da base de dados da cidade de Nova York?
df1.host_id.nunique()
30232
6 - Como é a variação do preços dos imóveis em NY?
df1.price.std().round(2)
196.99
7 - Existem mais imóveis baratos ou caros?
px.histogram(df1, 'price', nbins=300)
# Recortando o gráfico com valores menor que US$1000 dólares
px.histogram(df1.loc[df1['price'] < 1000, :], 'price', nbins=300)
8 - Qual a distribuição do número de Reviews? Existem imóveis com muitos e outro com poucos reviews?
px.histogram(df1, 'number_of_reviews', nbins=200)
9 - Qual é o valor do aluguel (diária) mais caro de cada região da base de dados da cidade de NY? (Apenas dos imóveis disponíveis para alugar)
# Remover imóveis com a coluna availability_365 igual a 0
df2 = df1.loc[df1['availability_365'] > 0, :]
cols = ['neighbourhood_group', 'price']
data_plot = df2.loc[:, cols].groupby('neighbourhood_group').max().reset_index()
px.bar(data_plot, x='neighbourhood_group', y='price')
10 - Conseguimos saber onde estão localizados os imóveis com o valor do aluguel mais caro, na cidade de NY?
# Conjunto de dados com as coordenadas
cols = ['neighbourhood_group', 'price', 'latitude', 'longitude']
data_plot = df2.loc[:, cols].groupby('neighbourhood_group').max().reset_index()
# comando para desenhar o mapa
mapa = folium.Map()
# Colocar os pontos de latitude e longitude dentro do mapa
for index, location_info in data_plot.iterrows():
folium.Marker([location_info['latitude'], location_info['longitude']],
popup=location_info['neighbourhood_group']).add_to(mapa)
mapa
11 - Conseguimos saber onde estão localizados os imóveis pelo seu tipo?
cols = ['neighbourhood_group', 'room_type', 'latitude', 'longitude']
data_plot = df2.loc[:, cols].sample(120)
# criando nova coluna
data_plot.loc[:, 'color'] = 'NA'
# atribuindo uma cor para cada room type
data_plot.loc[data_plot['room_type'] == 'Private room', 'color'] = 'darkblue'
data_plot.loc[data_plot['room_type'] == 'Entire home/apt', 'color'] = 'darkred'
data_plot.loc[data_plot['room_type'] == 'Shared room', 'color'] = 'gray'
# Desenhando o mapa
mapa = folium.Map()
# Colocando os pontos dentro do mapa
for index, location_info in data_plot.iterrows():
folium.Marker([location_info['latitude'],
location_info['longitude']],
popup=location_info['neighbourhood_group'],
icon=folium.Icon(color=location_info['color'])).add_to(mapa)
mapa
Tendo feito toda a inferência sobre os dados coletados, cheguei às seguintes respostas:
Dataset Kaggle: https://www.kaggle.com/datasets/dgomonov/new-york-city-airbnb-open-data